package handler

import (
	"UserServer/model/database"
	"UserServer/rpc/pb"
	"context"
	"errors"
	"github.com/redis/go-redis/v9"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
	"gorm.io/gorm"
	"time"
)

type JwtServer struct {
	pb.UnimplementedJwtServer
}

// 这里设置了两个redis
// 一个是token：“”
// 一个是uuid ：token

func (JwtServer) IsInBlackList(ctx context.Context, request *pb.RefreshReq) (*pb.JwtResponse, error) {
	// 1.先查缓存，在查数据库
	_, err := SC.Cache.Get(ctx, request.RefreshToken).Result()
	if errors.Is(err, redis.Nil) {
		blackList := &database.JwtBlacklist{}
		if err := SC.DB.Model(&database.JwtBlacklist{}).Where("jwt = ?", request.RefreshToken).First(blackList).Error; err != nil {
			// 如果数据库不存在则返回
			if errors.Is(err, gorm.ErrRecordNotFound) {
				return nil, status.Error(codes.NotFound, "黑名单不存在该token")
			}
			// 是错误，就返回下面这个
			return nil, status.Error(codes.Internal, err.Error())
		} else {
			// 如果找到了就返回
			return nil, status.Errorf(codes.OK, "")
		}
	} else if err != nil {
		return nil, status.Error(codes.Internal, err.Error())
	}
	return nil, status.Errorf(codes.OK, "")
}

func (JwtServer) GetRedisJWT(ctx context.Context, request *pb.GetRedisJwtReq) (*pb.RefreshResp, error) {
	refreshToken, err := SC.Cache.Get(ctx, request.Uuid).Result()
	if errors.Is(err, redis.Nil) {
		// 键不存在，返回 gRPC NotFound 错误
		return nil, status.Error(codes.NotFound, "refreshToken不存在")
	}
	if err != nil {
		// 其他 Redis 错误（如连接问题），返回 Internal 错误
		return nil, status.Error(codes.Internal, "Redis 操作失败")
	}
	// 成功找到
	return &pb.RefreshResp{
		RefreshToken: refreshToken,
	}, nil
}

func (JwtServer) SetRedisJWT(ctx context.Context, request *pb.SetRedisJwtReq) (*pb.JwtResponse, error) {
	duration, _ := time.ParseDuration(request.Duration)
	return nil, SC.Cache.Set(ctx, request.Uuid, request.RefreshToken, duration).Err()
}
